/*****************************************
 *	PropiedadesNivel.cpp
 * 	Autor: Martin Lucero
 ****************************************/

#include "PropiedadesNivel.h"
#include "VentanaDiseniador.h"
#include <gtkmm/label.h>

PropiedadesNivel::LineaSalidaPajaros::LineaSalidaPajaros(unsigned posXinicial,
		unsigned posYinicial, unsigned posXfinal, unsigned posYfinal) {
	pos_x_inicial = posXinicial;
	pos_y_inicial = posYinicial;
	pos_x_final = posXfinal;
	pos_y_final = posYfinal;
}

PropiedadesNivel::LineaSalidaPajaros::~LineaSalidaPajaros() { }

PropiedadesNivel::PropiedadesNivel() {
	set_row_spacing(3);
	set_column_spacing(5);

	Gtk::Label *etiqueta;

	++max_id;
	// @todo: igual esto no arregla que los niveles creados anteriormente incrementen su idmax

	ajuste_id = Gtk::Adjustment::create(max_id, 1, max_id);
	d_SpinButton_id.set_adjustment(ajuste_id);
	d_SpinButton_id.set_wrap();
	d_SpinButton_id.set_numeric();
	d_SpinButton_id.set_alignment(Gtk::ALIGN_CENTER);
	d_SpinButton_id.set_update_policy(Gtk::UPDATE_IF_VALID);
	d_SpinButton_id.signal_changed().connect(sigc::mem_fun(
			*this, &PropiedadesNivel::on_id_changed));
	// @todo: el signal connect causa la repeticion de niveles


	ajuste_anchura = Gtk::Adjustment::create(MIN_ANCHURA_NIVEL, MIN_ANCHURA_NIVEL,
			MAX_ANCHURA_NIVEL);
	d_SpinButton_anchura.set_adjustment(ajuste_anchura);
	d_SpinButton_anchura.set_wrap();
	d_SpinButton_anchura.set_numeric();
	d_SpinButton_anchura.set_alignment(Gtk::ALIGN_CENTER);
	d_SpinButton_anchura.set_update_policy(Gtk::UPDATE_IF_VALID);
	d_SpinButton_anchura.signal_value_changed().connect(
			sigc::mem_fun(*this, &PropiedadesNivel::on_anchura_value_changed));

	ajuste_altura = Gtk::Adjustment::create(MIN_ALTURA_NIVEL, MIN_ALTURA_NIVEL, MAX_ALTURA_NIVEL);
	d_SpinButton_altura.set_adjustment(ajuste_altura);
	d_SpinButton_altura.set_wrap();
	d_SpinButton_altura.set_numeric();
	d_SpinButton_altura.set_alignment(Gtk::ALIGN_CENTER);
	d_SpinButton_altura.set_update_policy(Gtk::UPDATE_IF_VALID);
	d_SpinButton_altura.signal_value_changed().connect(
			sigc::mem_fun(*this, &PropiedadesNivel::on_altura_value_changed));

	ajuste_tiempo = Gtk::Adjustment::create(MIN_TIEMPO_NIVEL, MIN_TIEMPO_NIVEL, MAX_TIEMPO_NIVEL);
	d_SpinButton_tiempo.set_adjustment(ajuste_tiempo);
	d_SpinButton_tiempo.set_wrap();
	d_SpinButton_tiempo.set_numeric();
	d_SpinButton_tiempo.set_alignment(Gtk::ALIGN_CENTER);
	d_SpinButton_tiempo.set_update_policy(Gtk::UPDATE_IF_VALID);

	Glib::RefPtr<Gtk::FileFilter> filtroImagenes = Gtk::FileFilter::create();
	filtroImagenes->set_name("Image files");
	filtroImagenes->add_mime_type("image/png");
	d_FileChooserButton_imagen.add_filter(filtroImagenes);
	d_FileChooserButton_imagen.set_title("Seleccionar Imagen");
	d_FileChooserButton_imagen.set_filename(RUTA_IMAGEN_FONDO_DEFECTO);
	d_FileChooserButton_imagen.set_width_chars(14);
	d_FileChooserButton_imagen.signal_file_set().connect(
			sigc::mem_fun(*this, &PropiedadesNivel::on_file_set));

	d_Button_salidaPajaros.set_label("Generacion Pajaros");
	d_Button_salidaPajaros.signal_clicked().connect(sigc::mem_fun(
			*this, &PropiedadesNivel::on_button_generador_clicked));

	etiqueta = Gtk::manage(
			new Gtk::Label("PROPIEDADES DEL NIVEL", Gtk::ALIGN_CENTER));
	attach(*etiqueta, 0, 0, 2, 1);

	etiqueta = Gtk::manage(new Gtk::Label("Orden en el mundo", Gtk::ALIGN_END));
	attach(*etiqueta, 0, 1, 1, 1);
	attach_next_to(d_SpinButton_id, *etiqueta, Gtk::POS_RIGHT, 1, 1);

	etiqueta = Gtk::manage(new Gtk::Label("Imagen de Fondo", Gtk::ALIGN_END));
	attach(*etiqueta, 0, 2, 1, 1);
	attach_next_to(d_FileChooserButton_imagen, *etiqueta, Gtk::POS_RIGHT, 1, 1);

	etiqueta = Gtk::manage(new Gtk::Label("Anchura (pixeles)", Gtk::ALIGN_END));
	attach(*etiqueta, 0, 3, 1, 1);
	attach_next_to(d_SpinButton_anchura, *etiqueta, Gtk::POS_RIGHT, 1, 1);

	etiqueta = Gtk::manage(new Gtk::Label("Altura (pixeles)", Gtk::ALIGN_END));
	attach(*etiqueta, 0, 4, 1, 1);
	attach_next_to(d_SpinButton_altura, *etiqueta, Gtk::POS_RIGHT, 1, 1);

	etiqueta = Gtk::manage(new Gtk::Label("Tiempo (seg)", Gtk::ALIGN_END));
	attach(*etiqueta, 0, 5, 1, 1);
	attach_next_to(d_SpinButton_tiempo, *etiqueta, Gtk::POS_RIGHT, 1, 1);

	attach(d_Button_salidaPajaros, 0, 6, 2, 1);

	lienzo_nivel = new Lienzo;
	d_window_salidaPajaros = new VentanaSalidaPajaros(this);
}

unsigned PropiedadesNivel::getId() const {
	return (unsigned)d_SpinButton_id.get_value_as_int();
}

Lienzo* PropiedadesNivel::getLienzoNivel() const {
	return lienzo_nivel;
}

unsigned PropiedadesNivel::getMaxAnchura() const {
	return ((unsigned)d_SpinButton_anchura.get_value_as_int() - 1);
}

unsigned PropiedadesNivel::getMaxAltura() const {
	return ((unsigned)d_SpinButton_altura.get_value_as_int() - 1);
}

void PropiedadesNivel::agregarLineaSalidaPajaros(unsigned posXinicial,
		unsigned posYinicial, unsigned posXfinal, unsigned posYfinal) {
	LineaSalidaPajaros *nuevaLinea = new LineaSalidaPajaros(posXinicial,
			posYinicial, posXfinal, posYfinal);
	vec_salidaPajaros.push_back(nuevaLinea);

	/* Agrego la linea para que se dibuje en el lienzo */
	lienzo_nivel->agregarLinea(posXinicial, posYinicial, posXfinal, posYfinal);
	lienzo_nivel->queue_draw();
}

//void PropiedadesNivel::resetear() {
//	for (unsigned i = 0; i < vec_salidaPajaros.size(); ++i) {
//		delete (vec_salidaPajaros[i]);
//	}
//	vec_salidaPajaros.clear();
//	d_FileChooserButton_imagen.set_filename(RUTA_IMAGEN_FONDO_DEFECTO);
//	ajuste_id->set_value(1);
//	ajuste_anchura->set_value(MIN_ANCHURA_NIVEL);
//	ajuste_altura->set_value(MIN_ALTURA_NIVEL);
//	ajuste_tiempo->set_value(MIN_TIEMPO_NIVEL);
//	lienzo_nivel->resetear();
//	// @todo: resetar punteros lienzo y ventanaSalidaPajaros?	
//}

//void PropiedadesNivel::guardar(Mundo &mundo) {
//	unsigned id = (unsigned)d_SpinButton_id.get_value_as_int();
//	unsigned anchura = (unsigned)d_SpinButton_anchura.get_value_as_int();
//	unsigned altura = (unsigned)d_SpinButton_altura.get_value_as_int();
//	unsigned tiempo = (unsigned)d_SpinButton_tiempo.get_value_as_int();
//	std::string rutaImagen = d_FileChooserButton_imagen.get_filename();
//	Nivel* nivel = mundo.crearNivel(id, anchura, altura, tiempo, rutaImagen);
//	if(nivel != NULL) {
//		lienzo_nivel->guardar(nivel->getEscenario());
//	}
//}
//
//void PropiedadesNivel::cargar(const Mundo& mundo) { }

void PropiedadesNivel::on_id_changed() {
	VentanaDiseniador *ventana = dynamic_cast<VentanaDiseniador*>(
			get_toplevel());
	ventana->getVistaNavegador()->on_id_nivel_changed(
			d_SpinButton_id.get_value_as_int());
}

void PropiedadesNivel::on_file_set() {
	lienzo_nivel->setImagenFondo(d_FileChooserButton_imagen.get_filename());

}

void PropiedadesNivel::on_anchura_value_changed() {
	lienzo_nivel->setAnchura((unsigned)d_SpinButton_anchura.get_value_as_int());
}

void PropiedadesNivel::on_altura_value_changed() {
	lienzo_nivel->setAltura((unsigned)d_SpinButton_altura.get_value_as_int());
}

void PropiedadesNivel::on_button_generador_clicked() {
	if (d_window_salidaPajaros == NULL) {
		d_window_salidaPajaros = new VentanaSalidaPajaros(this);
	}
	else {
		d_window_salidaPajaros->resetear();
	}
	d_window_salidaPajaros->show();
}

PropiedadesNivel::~PropiedadesNivel() {
	for (unsigned i = 0; i < vec_salidaPajaros.size(); ++i) {
		delete (vec_salidaPajaros[i]);
	}
	if (d_window_salidaPajaros != NULL) {
		delete d_window_salidaPajaros;
	}
	if (lienzo_nivel != NULL) {
		delete lienzo_nivel;
	}
}

unsigned PropiedadesNivel::max_id = 0;

// @todo: cuando se cambia el id se debe actualizar en la vista de navegador